# @Time    : 2022/10/22 15:16
# @Author  : 南黎
# @FileName: 3.对决策树其他参数的研究与可视化.py
import matplotlib
import sklearn.tree
from sklearn.datasets import load_iris
# 导入决策树分类器
from sklearn.tree import DecisionTreeClassifier, plot_tree
# 导入分割数据集的方法
from sklearn.model_selection import train_test_split
# 导入科学计算包
import numpy as np
# 导入绘图库
import matplotlib.pyplot as plt

# 加载鸢尾花数据集
iris_dataset = load_iris()
# 分割训练集与测试集
X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],test_size=0.2,random_state=0)

def Mytest_splitter(my_splitter):
    # 创建决策时分类器-
    tree_model=DecisionTreeClassifier(criterion="entropy",max_depth=4,random_state=0,splitter=my_splitter)
    # - 特征选择标准 criterion: string, 默认是 “gini”) 设置为‘gini’（基尼系数）或是‘entropy’（信息熵）
    # - 决策树最大深度 max_depth：int或None，可选（默认=None）树的最大深度。如果为 None，则扩展节点直到所有叶子都是纯的或直到所有叶子包含少于 min_samples_split 样本。
    # - 随机数生成器使用的种子 random_state：int，建议设置一个常数保证在研究参数时不会被随机数干扰。如果为 None，则随机数生成器是 RandomState 使用的实例np.random
    # - 拆分器 splitter：字符串，可选（默认=“最佳”）用于在每个节点处选择拆分的策略。默认是 default=”best”，或者是“random”

    # 喂入数据
    tree_model.fit(X_train,y_train)

    # 打印模型评分
    print("模型评分:{}".format(tree_model.score(X_test,y_test)))
    # 随机生成一组数据使用我们的模型预测分类
    X_iris_test=np.array([[1.0,3.4,1.5,0.2]])
    # 用训练好的模型预测随机生成的样本数据的出的分类结果
    predict_result=tree_model.predict(X_iris_test)
    # 打印预测分类结果
    print(predict_result)
    print("分类结果：{}".format(iris_dataset['target_names'][predict_result]))

    # 模型可视化
    iris_feature_names=iris_dataset.feature_names#鸢尾花特征名列表 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
    iris_class_names=iris_dataset.target_names#鸢尾花分类类名列表 ['setosa' 'versicolor' 'virginica']

    fig = plt.figure(figsize=(20, 12))#图片画布大小比例
    matplotlib.rcParams['font.sans-serif'] = [u'SimHei']  # 用来设置字体样式以正常显示中文标签
    matplotlib.rcParams['axes.unicode_minus'] = False  # 设置为 Fasle 来解决负号的乱码问题
    sklearn.tree.plot_tree(tree_model,feature_names=iris_feature_names, class_names=iris_class_names, rounded=True, filled= True, fontsize=14)
    # 模型对象名
    # feature_names 特征名称的列表
    # class_names 分类名称的列表

    plt.title("决策树拆分器={}的可视化图".format(my_splitter))
    plt.savefig("3/决策树拆分器={}的可视化图.png".format(my_splitter))
    plt.show()

Mytest_splitter("best")#
Mytest_splitter("random")#